from sqlalchemy import create_engine, exc
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import logging
from config.mysql_settings import DATABASE_URL
from urllib.parse import urlparse

# 配置全局的日志级别为 WARNING（或其他级别）
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)

# 解析原始数据库 URL，移除数据库名
parsed_url = urlparse(DATABASE_URL)
database_name = parsed_url.path[1:]  # 获取数据库名称
server_url = f"{parsed_url.scheme}://{parsed_url.netloc}"  # 不包含数据库名称的 URL

# 创建数据库引擎（连接到 MySQL 服务器，而不是特定数据库）
server_engine = create_engine(server_url)

# 检查数据库是否存在，如果不存在则创建
try:
    with server_engine.connect() as conn:
        conn.execute(f"CREATE DATABASE IF NOT EXISTS {database_name}")
except exc.SQLAlchemyError as e:
    logging.error(f"Database creation failed: {e}")
finally:
    server_engine.dispose()

# 创建数据库引擎
engine = create_engine(
    DATABASE_URL,
    pool_pre_ping=True,  # 在连接池中使用连接之前测试连接的可用性
    echo=True,  # 可选，打印SQLAlchemy的日志
    pool_size=10,  # 根据需求设置连接池大小
    max_overflow=20,  # 允许的最大连接数
    pool_recycle=1800,  # 回收连接时间（秒）
)

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建基本的ORM模型
Base = declarative_base()


# 获取数据库会话对象的函数
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
